\chapter{研究}
研究一些基本的数据，建立基本的概念，合理地设置数据模型。倾向于如何更好地设计一个软件方面的思想。市场上有那么多的技术，到底哪个好啊，用哪个比较不错啊。A这样写感觉非常的简洁，B那样写好像更好一点，采用哪个就成了难题。
\url{https://blog.csdn.net/sinat_20265495/article/details/52004082}
\url{https://blog.csdn.net/hzm8341/article/details/70941698}
\url{https://blog.csdn.net/jonathan321/article/details/78106101}

\section{如何高效、优雅的地设计C++的类？}
\subsection{类的需求}
1、设计该类的目的

清晰的概念远比模棱两口的理解，更能帮助我们深入分析问题。有时候我们觉得我就是需要实现这个功能罢了，只要能用就好了。然而，多和产品经理或技术经理沟通，有可能出现意想不到的结果：

该功能没有我们想到那么复杂，并不需要自己设计；

该功能比我们想到的更加复杂，我们需要考虑更多正确性、高效性、扩展性、维护性等方面的额问题。

2、使用该类的场景

不同的使用场景，相同功能类的设计需求是不一样的。譬如，设计一个视频解码类，如果使用场景为视频播放器，那我们设计的类必须要考虑不同的编码格式；但如果使用场景为视频会议，我们设计的类就不需要考虑太多编码格式的问题，反而需要针对某种格式进行效率优化。

3、潜在的扩展方向

程序不是一成不变的，外界事物不停的变化，催生不同的需求。如果我们的程序不可扩展，那每次需求变更，之前的工作都白费了。类的设计一定要考虑到，未来潜在的扩展方向。如果我们无法确定潜在的扩展方向，至少留下可扩展的接口，不要把一切行为、属性都写死。
\subsection{构造函数、析构函数、拷贝赋值}
C++类的构造析构和拷贝赋值是设计C++类时最基本的要点，有不少细节部分需要考虑：

构造函数：合成的默认构造函数、默认构造函数、default关键词、explicit关键字、类型转换、延迟初始化、单例模式

析构函数：默认析构函数、虚析构函数

拷贝构造函数：深拷贝/浅拷贝、禁止拷贝

赋值构造函数：深拷贝/浅拷贝、禁止拷贝

除了上面的细节部分，我们需要明确几个准则：

除非默认操作非你所需，否则请用=default来定义构造析构函数；

除非编译器合成为你所需，否则请用=delete来定义赋值拷贝函数；

除非类不可能成为基类，否则请将析构函数定义为virtual；

构造与析构过程中，不调用virtual函数、析构函数不能抛出异常。

拷贝构造复制需要处理深拷贝和浅拷贝，赋值操作需要额外考虑自我赋值。【浅拷贝】只是增加了一个指针，指向已存在对象的内存。【深拷贝】是增加了一个指针，并新开辟了一块空间，让指针指向这块新开辟的空间。【浅拷贝】在多个对象指向一块空间的时候，释放一个空间会导致其他对象所使用的空间也被释放了，再次释放便会出现错误。

\subsection{如何设计接口？}
\section{如何实现一款有限元软件？}

\section{工程结构}
一个良好的工程目录结构，不仅能够帮助你整理思路，而且能够让源代码的阅读者更加容易的理解你的工程内容。看了太多的源代码，发现不同的团队，开发的风格真的是迥异。
